\section{数据库迁移}

迁移就像数据库的版本控制，允许团队简单轻松的编辑并共享应用的数据库表结构，迁移通常和Laravel的结构构建器配对使用，从而可以很容易地构建应用的数据库表结构。

\subsection{生成迁移}
使用 artisan 命令来创建一个新的迁移\footnote{一次数据库迁移可视为对数据库的一次操作，比如创建，或者删除。}：

\begin{lstlisting}
php artisan migrate
\end{lstlisting}
该命令会搜索database/migrations目录下的每个迁移文件，并按时间顺序创建表。
成功执行后，会在项目数据库中新增三个数据表（Laravel默认的users、password\_resets和migrations）。

\begin{myremark}{迁移之前需要配置数据库}
使用migrate命令生成数据表之前，开发人员应该创建好数据库，并配置好环境文件.env中的对应内容。
\end{myremark}

\subsection{回滚迁移}
想要回滚最新的一次迁移“操作”，可以使用rollback命令，注意这将会回滚最后一批运行的迁移，可能包含多个迁移文件：

\begin{lstlisting}
php artisan migrate:rollback
\end{lstlisting}

还可以回滚所有的应用迁移：

\begin{lstlisting}
php artisan migrate:reset
\end{lstlisting}

\subsection{编写迁移}

\subsubsection{新增数据表}
使用artisan make:migration 命令可以新增数据表迁移：

\begin{lstlisting}
C:\wamp\www\blog>php artisan make:migration create_article_table --create="articles"
\end{lstlisting}
其中create\_article\_table为迁移命令名称，--create="articles" 表示新增名为articles的数据表。

使用migration新增的迁移类中，自动创建了两个方法，一个名为up，一个为down，分别对应新增表和删除表。显然，我们应该按实际需要在up方法中调整我们的字段名称和类型等数据表信息。

\subsubsection{修改数据表结构}
在up方法中，使用Schema的table方法，和create方法一样，table方法接收两个参数：表名和获取用于添加列到表的Blueprint实例的闭包：

\begin{lstlisting}
public function up() {
	Schema::create('articles', function (Blueprint $table) {
		$table->increments('id');
		$table->text('body');
		$table->string('title');
		$table->timestamps('published_at');
		$table->timestamps();
	});
}
\end{lstlisting}

现在，如果我们再执行migrate命令，就会创建一个名为articles的数据表，表的字段结构会按照我们在up方法中指定的格式完成。

\subsection{新增字段}
在有些时候，我们需要为已经存在并且有大量数据的数据表新增字段。这个时候，我们肯定不能将表删除后新建。最好的办法就是在现有基础上新增字段，要完成这样的需求，我们可以先创建新增字段的数据库迁移。比如，我们使用下列命令创建为articles表新增字段excerpt的迁移：

\begin{lstlisting}
php artisan make:migration add_excerpt_to_articles_table --table="articles"
\end{lstlisting}

其中add\_excerpt\_to\_articles\_table是该迁移命令的名称（或者说明），--table="articles" 表示为articles表进行操作。

然后在生成的类的up方法中，写入新增字段的特性（详细\href{https://laravel.com/docs/5.2/migrations}{字段特性设置方法可查阅Laravel的手册}）：

\begin{lstlisting}
	public function up() {
		Schema::table('articles', function (Blueprint $table) {
			$table->text('excerpt')->nullable();
		});
	}
\end{lstlisting}

同时，为对应回滚操作的down方法，写入删除字段的内容：

\begin{lstlisting}
public function down() {
	Schema::table('articles', function (Blueprint $table) {
		$table->dropColumn('excerpt');
	});
}
\end{lstlisting}

这样我们就能使用migrate命令完成新增字段的操作。
